﻿// 3591. 堆栈的使用.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <stack>


using namespace std;

/*
https://www.acwing.com/problem/content/3594/

堆栈是一种基本的数据结构。

堆栈具有两种基本操作方式，push 和 pop。

Push 一个值会将其压入栈顶，而 pop 则会将栈顶的值弹出。

现在我们就来验证一下堆栈的使用。

输入格式
输入包含多组测试数据。

每组数据，第一行包含一个整数 n。

接下来 n行，每行的第一个字符可能是 P 或者 O 或者 A；
如果是 P，后面还会跟着一个整数，表示把这个数据压入堆栈；
如果是 O，表示将栈顶的值 pop 出来，如果堆栈中没有元素时，忽略本次操作；
如果是 A，表示询问当前栈顶的值，如果当时栈为空，则输出 E。

堆栈开始为空。

当输入一行为 n=0时，表示输入结束。

输出格式
对于每组测试数据，根据其中的命令字符来处理堆栈；并对所有的 A 操作，输出当时栈顶的值，
每个占据一行，如果当时栈为空，则输出 E。

当每组测试数据完成后，输出一个空行。

数据范围
每个输入最多包含 10组数据。
1≤n≤104。
栈中元素取值范围 [1,10000]。

输入样例：
3
A
P 5
A
4
P 3
P 6
O
A
0
输出样例：
E
5

3
*/

int n;

void solve() {
	stack<int> st;

	while (n--) {
		string op;
		cin >> op;
		if (op == "A") {
			if (st.empty()) {
				cout << "E" << endl;
			}
			else {
				cout << st.top() << endl;
			}
		}
		else if (op == "P") {
			int t; cin >> t;
			st.push(t);
		}
		else if (op == "O") {
			if (!st.empty()) {
				st.pop();
			}
		}
	}
	cout << endl;

}

int main()
{
	while (cin >> n) {
		if (n == 0) break;
		solve();
	}
}

 